/*
 * Copyright (C) 2008-2010 TrinityCore <http://www.trinitycore.org/>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

/* ScriptData
 SDName: Npc_Innkeeper
 SDAuthor: WarHead
 SD%Complete: 99%
 SDComment: Complete
 SDCategory: NPCs
 EndScriptData */

#include "ScriptPCH.h"

#define HALLOWEEN_EVENTID       12
#define SPELL_TRICK_OR_TREATED  24755
#define SPELL_TREAT             24715

#define LOCALE_TRICK_OR_TREAT_0 "Trick or Treat!"
#define LOCALE_TRICK_OR_TREAT_2 "Des bonbons ou des blagues!"
#define LOCALE_TRICK_OR_TREAT_3 "Süßes oder Saures!"
#define LOCALE_TRICK_OR_TREAT_6 "¡Truco o trato!"

#define LOCALE_INNKEEPER_0 "Make this inn my home."
#define LOCALE_INNKEEPER_3 "Ich möchte dieses Gasthaus zu meinem Heimatort machen."

class npc_innkeeper: public CreatureScript {
public:
	npc_innkeeper() :
			CreatureScript("npc_innkeeper") {
	}

	bool OnGossipHello(Player *pPlayer, Creature *pCreature) {
		if (IsEventActive(HALLOWEEN_EVENTID)
				&& !pPlayer->HasAura(SPELL_TRICK_OR_TREATED)) {
			const char* localizedEntry;
			switch (pPlayer->GetSession()->GetSessionDbcLocale()) {
			case LOCALE_frFR:
				localizedEntry = LOCALE_TRICK_OR_TREAT_2;
				break;
			case LOCALE_deDE:
				localizedEntry = LOCALE_TRICK_OR_TREAT_3;
				break;
			case LOCALE_esES:
				localizedEntry = LOCALE_TRICK_OR_TREAT_6;
				break;
			case LOCALE_enUS:
			default:
				localizedEntry = LOCALE_TRICK_OR_TREAT_0;
			}
			pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID);
		}

		if (pCreature->isQuestGiver())
			pPlayer->PrepareQuestMenu(pCreature->GetGUID());

		if (pCreature->isVendor())
			pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);

		if (pCreature->isInnkeeper()) {
			const char* localizedEntry;
			switch (pPlayer->GetSession()->GetSessionDbcLocale()) {
			case LOCALE_deDE:
				localizedEntry = LOCALE_INNKEEPER_3;
				break;
			case LOCALE_enUS:
			default:
				localizedEntry = LOCALE_INNKEEPER_0;
			}
			pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN);
		}

		pPlayer->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID());
		pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
		return true;
	}

	bool OnGossipSelect(Player* pPlayer, Creature* pCreature,
			uint32 /*uiSender*/, uint32 uiAction) {
		pPlayer->PlayerTalkClass->ClearMenus();
		if (uiAction == GOSSIP_ACTION_INFO_DEF + HALLOWEEN_EVENTID
				&& IsEventActive(HALLOWEEN_EVENTID)
				&& !pPlayer->HasAura(SPELL_TRICK_OR_TREATED)) {
			pPlayer->CastSpell(pPlayer, SPELL_TRICK_OR_TREATED, true);

			if (urand(0, 1))
				pPlayer->CastSpell(pPlayer, SPELL_TREAT, true);
			else {
				uint32 trickspell = 0;
				switch (urand(0, 13)) {
				case 0:
					trickspell = 24753;
					break; // cannot cast, random 30sec
				case 1:
					trickspell = 24713;
					break; // lepper gnome costume
				case 2:
					trickspell = 24735;
					break; // male ghost costume
				case 3:
					trickspell = 24736;
					break; // female ghostcostume
				case 4:
					trickspell = 24710;
					break; // male ninja costume
				case 5:
					trickspell = 24711;
					break; // female ninja costume
				case 6:
					trickspell = 24708;
					break; // male pirate costume
				case 7:
					trickspell = 24709;
					break; // female pirate costume
				case 8:
					trickspell = 24723;
					break; // skeleton costume
				case 9:
					trickspell = 24753;
					break; // Trick
				case 10:
					trickspell = 24924;
					break; // Hallow's End Candy
				case 11:
					trickspell = 24925;
					break; // Hallow's End Candy
				case 12:
					trickspell = 24926;
					break; // Hallow's End Candy
				case 13:
					trickspell = 24927;
					break; // Hallow's End Candy
				}
				pPlayer->CastSpell(pPlayer, trickspell, true);
			}
			pPlayer->CLOSE_GOSSIP_MENU();
			return true;
		}

		pPlayer->CLOSE_GOSSIP_MENU();

		switch (uiAction) {
		case GOSSIP_ACTION_TRADE:
			pPlayer->SEND_VENDORLIST(pCreature->GetGUID());
			break;
		case GOSSIP_ACTION_INN:
			pPlayer->SetBindPoint(pCreature->GetGUID());
			break;
		}
		return true;
	}
};

void AddSC_npc_innkeeper() {
	new npc_innkeeper;
}
